leetcode 36. 有效的数独

暴力法,也没有用什么技巧。

题目

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

示例 1:

输入:
[
[“5”,”3”,”.”,”.”,”7”,”.”,”.”,”.”,”.”],
[“6”,”.”,”.”,”1”,”9”,”5”,”.”,”.”,”.”],
[“.”,”9”,”8”,”.”,”.”,”.”,”.”,”6”,”.”],
[“8”,”.”,”.”,”.”,”6”,”.”,”.”,”.”,”3”],
[“4”,”.”,”.”,”8”,”.”,”3”,”.”,”.”,”1”],
[“7”,”.”,”.”,”.”,”2”,”.”,”.”,”.”,”6”],
[“.”,”6”,”.”,”.”,”.”,”.”,”2”,”8”,”.”],
[“.”,”.”,”.”,”4”,”1”,”9”,”.”,”.”,”5”],
[“.”,”.”,”.”,”.”,”8”,”.”,”.”,”7”,”9”]
]
输出: true
示例 2:

输入:
[
[“8”,”3”,”.”,”.”,”7”,”.”,”.”,”.”,”.”],
[“6”,”.”,”.”,”1”,”9”,”5”,”.”,”.”,”.”],
[“.”,”9”,”8”,”.”,”.”,”.”,”.”,”6”,”.”],
[“8”,”.”,”.”,”.”,”6”,”.”,”.”,”.”,”3”],
[“4”,”.”,”.”,”8”,”.”,”3”,”.”,”.”,”1”],
[“7”,”.”,”.”,”.”,”2”,”.”,”.”,”.”,”6”],
[“.”,”6”,”.”,”.”,”.”,”.”,”2”,”8”,”.”],
[“.”,”.”,”.”,”4”,”1”,”9”,”.”,”.”,”5”],
[“.”,”.”,”.”,”.”,”8”,”.”,”.”,”7”,”9”]
]
输出: false
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
说明:

一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 ‘.’ 。
给定数独永远是 9x9 形式的。

思路

首先判断每一行是否满足,在判断每一列是否满足,在判断每一列的三个3*3方块是否满足,就是这么暴力。

code

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        for(int i=0;i<9;++i)
        {
            vector<int>num(10,0);
            for(int j=0;j<9;++j)
            {
                if(board[i][j]=='.')
                    continue;
                else
                {
                    int index=board[i][j]-'0';
                    num[index]++;
                    if(num[index]>1)
                        return false;
                }

            }
        }
        for(int j=0;j<9;++j)
        {
            vector<int>num(10,0);
            for(int i=0;i<9;++i)
            {
                if(board[i][j]=='.')
                    continue;
                else
                {
                    int index=board[i][j]-'0';
                    num[index]++;
                    if(num[index]>1)
                        return false;
                }
            }  
        }
        int i=0;
        int j=0;
        while(i<9)//判断第1列3*3方块
        {
            vector<int>num(10,0);
            int l1=3;
            while(l1--)
            {
                int l2=3;
                while(l2--)
                {
                    if(board[i][j]!='.')
                    {
                        int index=board[i][j]-'0';
                        num[index]++;
                        if(num[index]>1)
                            return false;
                    }
                    i=i+(j+1)/3;
                    j=(j+1)%3;
                }
            }
        }
        i=0;j=3;
        while(i<9)//判断第2列3*3方块
        {
            vector<int>num(10,0);
            int l1=3;
            while(l1--)
            {
                int l2=3;
                while(l2--)
                {
                    if(board[i][j]!='.')
                    {
                        int index=board[i][j]-'0';
                        num[index]++;
                        if(num[index]>1)
                            return false;
                    }
                    i=i+(j+1)/6;
                    j=(j+1)%6;
                    if(j<3)
                        j=j+3;
                }
            }
        }
        i=0;j=6;
        while(i<9)//判断第3列3*3方块
        {
            vector<int>num(10,0);
            int l1=3;
            while(l1--)
            {
                int l2=3;
                while(l2--)
                {
                    if(board[i][j]!='.')
                    {
                        int index=board[i][j]-'0';
                        num[index]++;
                        if(num[index]>1)
                            return false;
                    }
                    i=i+(j+1)/9;
                    j=(j+1)%9;
                    if(j<6)
                        j=j+6;
                }
            }
        }
        return true;
    }
};

思路

把上面的代码简化一下。

code

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        vector<vector<int> > rows(10, vector<int>(10, 0));
        vector<vector<int> > cols(10, vector<int>(10, 0));
        vector<vector<int> > kuai(10, vector<int>(10, 0));
        for (int i = 0; i < 9; ++i)
        {
            for (int j = 0; j < 9; ++j) 
            {
                if (board[i][j] == '.') continue;
                int n = board[i][j] - '0';
                int k = i / 3 * 3 + j / 3;
                kuai[k][n] += 1;//记录在某行某列以及某块
                rows[i][n] += 1;
                cols[j][n] += 1;
                if(cols[j][n]==2|| rows[i][n]==2||kuai[k][n]==2 )
                    return false;
            }
        }

        return true;
    }
};